/**********************************************************************
 * Filename: Equipa.java
 * Created: 2012/04/23
 * @author Fernando Brito e Abreu
 **********************************************************************/
package iscte.es.copaPaises.businessLayer;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;


public class Equipa implements Comparable
{
	public static List<Equipa> allInstances = new LinkedList<Equipa>();

	private Jogo jogo;
	private Pais seleccao;

	/**********************************************************************
	 * Default constructor
	 **********************************************************************/
	public Equipa()
	{
		allInstances.add(this);
	}

	/**********************************************************************
	 * Parameterized constructor
	 * @param jogo the jogo to initialize
	 * @param seleccao the seleccao to initialize
	 **********************************************************************/
	public Equipa(Jogo jogo, Pais seleccao)
	{
		this.jogo = jogo;
		this.seleccao = seleccao;
		allInstances.add(this);
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER getter for Equipa[*] <-> Jogo[1]
	 * @return the jogo of the equipa
	 **********************************************************************/
	public Jogo jogo()
	{
		return jogo;
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER setter for Equipa[*] <-> Jogo[1]
	 * @param jogo the jogo to set
	 **********************************************************************/
	public void setJogo(Jogo jogo)
	{
		this.jogo = jogo;
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER getter for Equipa[*] <-> Pais[1]
	 * @return the seleccao of the equipa
	 **********************************************************************/
	public Pais seleccao()
	{
		return seleccao;
	}

	/**********************************************************************
	 * ASSOCIATIVE2MEMBER setter for Equipa[*] <-> Pais[1]
	 * @param seleccao the seleccao to set
	 **********************************************************************/
	public void setSeleccao(Pais seleccao)
	{
		this.seleccao = seleccao;
	}

	/**********************************************************************
	 * MEMBER2ASSOCIATIVE getter for Equipa[*] <-> Membro[11..*]
	 * @return the membro of the equipa
	 **********************************************************************/
	public Set<Membro> membro()
	{
		Set<Membro> result = new HashSet<Membro>();
		for (Membro x : Membro.allInstances)
			if (x.equipa()  ==  this)
				result.add(x);
				return result;
	}

	/**********************************************************************
	 * MEMBER2ASSOCIATIVE setter for Equipa[*] <-> Membro[11..*]
	 * @param membro the membro to set
	 **********************************************************************/
	public void setMembro(Set<Membro> membro)
	{
		for (Membro x : membro)
			x.setEquipa(this);
	}

	/**********************************************************************
	 * MEMBER2MEMBER getter for Equipa[*] <-> Jogador[11..*]
	 * @return the jogador of the equipa
	 **********************************************************************/
	public Set<Jogador> jogador()
	{
		Set<Jogador> result = new HashSet<Jogador>();
		for (Membro x : Membro.allInstances)
			if (x.equipa()  ==  this)
				result.add(x.jogador());
				return result;
	}

	/**********************************************************************
	 * MEMBER2MEMBER setter for Equipa[*] <-> Jogador[11..*]
	 * @param jogador the jogador to set
	 **********************************************************************/
	public void setJogador(Set<Jogador> jogador)
	{
		boolean encontrado;
		for (Jogador t : jogador){
			encontrado=false;
			for (Membro x: Membro.allInstances){
				if (x.equipa() == this && x.jogador()==null &&encontrado==false){
					x.setJogador(t);
					encontrado=true;
				}
			}
		}
	}

	/**********************************************************************
	 * User-defined operation specified in SOIL/OCL
	 **********************************************************************/
	public void criaFichaJogoFalsa()
	{
		//DONE
		// this.seleccao.participacao->select(p : Participacao | (p.participado = self.jogo.grupo.campeonato))->collectNested($e : Participacao | $e.plantel)->flatten->asSet;

		//for j in jogadores do membro := new Membro between (j,self);
		// if (j.data_nascimento.isLeap() and ((j.data_nascimento.month = 3) or (j.data_nascimento.month = 9))) then cartaoA := new Cartao;
		// cartaoA.inicializa(TipoCartao::Amarelo, (j.data_nascimento.day + j.data_nascimento.month), membro) end;
		//if ((j.data_nascimento.isLeap() and (j.data_nascimento.month = 3)) and (j.data_nascimento.day > 15)) then cartaoV := new Cartao;
		// cartaoV.inicializa(TipoCartao::Vermelho, ((j.data_nascimento.day * 2) + j.data_nascimento.month), membro) end;
		// if (((j.data_nascimento.month > 7) and (j.data_nascimento.day < 15)) and (j.posicao = PosicaoJogador::Avancado)) then golo := new Golo;
		// golo.inicializa(if j.data_nascimento.isLeap() then (j.data_nascimento.month * 7) else j.data_nascimento.day endif);
		// insert (membro,golo) into Membro_Golo end end;

		Set<Jogador> jogadores=new HashSet<Jogador>();

		for(Participacao p: this.seleccao.participacao()){
			if(p.participado()==this.jogo.grupo().campeonato()){
				for(Jogador j: p.plantel()){
					jogadores.add(j);
				}
			}
		}

		Membro membro = null;
		for (Jogador j : jogadores){
			membro=new Membro();
			membro.setJogador(j);
			membro.setEquipa(this);

			if(j.data_nascimento().isLeap() && ((j.data_nascimento().month() == 3) || (j.data_nascimento().month() == 9))){
				Cartao amarelo = new Cartao();
				amarelo.inicializa(TipoCartao.Amarelo, (j.data_nascimento().day() + j.data_nascimento().month()), membro);
			}
			if ((j.data_nascimento().isLeap() && (j.data_nascimento().month() == 3)) && (j.data_nascimento().day() > 15)){
				Cartao vermelho = new Cartao();
				vermelho.inicializa(TipoCartao.Vermelho, (j.data_nascimento().day()*2 + j.data_nascimento().month()), membro);
			}
			if((j.data_nascimento().month() > 7) && (j.data_nascimento().day() < 15) && (j.posicao() == PosicaoJogador.Avancado)){
				int minuto;
				Golo golo  = new Golo();
				if(j.data_nascimento().isLeap()){
					minuto =  (j.data_nascimento().month() * 7);
				}else{
					minuto = j.data_nascimento().day();
				}
				golo.inicializa(minuto);
				golo.setMarcador(membro);
			}
		}

	}






	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	/**********************************************************************
	 * Object serializer
	 **********************************************************************/
	public String toString()
	{
		return "Equipa [jogo=" + jogo + ", seleccao=" + seleccao + "]\n";
	}
	//	-------------------------------------------------------------------------------
	//	INVARIANTS (TODO)
	/*
	inv UmGuardaRedes
		(self.membro->collectNested($e : Membro | $e.jogador)->select($elem17 : Jogador | ($elem17.posicao = PosicaoJogador::GuardaRedes))->size > 0)

	 */

	@Override
	public int compareTo(Object arg0) {
		// TODO Auto-generated method stub
		return 1;
	}

}




